import util from './util';
import constant from './constant';
/*
 * API前缀处理：根据模块名称返回API前缀
 *
 * @param module 模块名称，如 user, course 等
 * @return 对应的API前缀，如 /user-server/api/v1/user 等，末尾无 / 符号
 * */
function apiPrefixFormat(module) {
    const USER_MODULES = ['menu', 'role', 'user'];
    const COURSE_MODULES = ['category', 'comment', 'course', 'episode', 'report', 'season'];
    const SALE_MODULES = ['article', 'banner', 'coupons', 'notice', 'seckill', 'seckillDetail'];
    const ORDER_MODULES = ['cart', 'order', 'orderDetail'];
    let microServiceName = '';
    if (USER_MODULES.indexOf(module) !== -1) {
        microServiceName = `user-server`;
    } else if (COURSE_MODULES.indexOf(module) !== -1) {
        microServiceName = `course-server`;
    } else if (SALE_MODULES.indexOf(module) !== -1) {
        microServiceName = `sale-server`;
    } else if (ORDER_MODULES.indexOf(module) !== -1) {
        microServiceName = `order-server`;
    }
    return `/${microServiceName}/api/v1/${module}`;
}
/**
 * 请求方法
 *
 * <p> module: 模块名称，如 user，必传。
 * <p> url: 请求地址，如 /selectById，必传。
 * <p> server: 服务器地址，默认是 constant.GATEWAY_HOST。
 * <p> method: 请求方式，默认 GET。
 * <p> header: 请求头，默认 application/json 类型并自动携带 Token 令牌。
 * <p> params: API请求函数参数，JSON格式，作为请求参数。
 */
const sendRequest = (config) => {
    // 必传参数
    let module = config['module'];
    let url = config['url'];
    // 空值保护
    if (util.hasNull(module, url)) return;
    // 可选参数
    let server = config['server'];
    let method = config['method'];
    let params = config['params'];
    let header = config['header'];
    // 设置默认值
    if (util.isEmpty(server)) server = constant.GATEWAY_HOST;
    if (util.isEmpty(method)) method = 'GET';
    if (util.isNull(header)) {
        header = {
            'Content-Type': 'application/json',
            'token': wx.getStorageSync('token') || null,
        }
    }
    // 仅用于日志输出
    config['url'] = server + apiPrefixFormat(module) + url;
    console.log('请求拦截器：', config);
    // 发送请求
    return new Promise((resolve, reject) => {
        wx.request({
            url: server + apiPrefixFormat(module) + url,
            method: method,
            data: params,
            header: header,
            // 请求成功
            success(res) {
                // 响应拦截器
                console.log('响应拦截器：', res);
                // 若存在2层data，则直接拆除第1层data
                res = res['data']['data'] !== undefined ? res['data'] : res;
                // 请求成功时返回数据或true
                if (res['code'] === constant.STATUS.SUCCESS) {
                    resolve(util.isNotNull(res['data']) ? res['data'] : true);
                } else {
                    reject('请求失败: ' + res['data']);
                }
            },
            // 请求失败
            fail(err) {
                reject('请求异常: ' + err);
            }
        });
    });
};
// 导出封装的request方法
module.exports = {
    /**
     * 发送 GET 请求
     *
     * <p> module: 模块名称，如 user，必传。
     * <p> url: 请求地址，如 /selectById，必传。
     * <p> params: API请求函数参数，JSON格式，作为请求参数。
     */
    get: (module, url, params) => {
        return sendRequest({module, url, params})
    },
    /**
     * 发送 POST 请求
     *
     * <p> module: 模块名称，如 user，必传。
     * <p> url: 请求地址，如 /selectById，必传。
     * <p> params: API请求函数参数，JSON格式，作为请求参数。
     */
    post: (module, url, params) => {
        return sendRequest({module, url, params, method: 'POST'})
    },
    /**
     * 发送 PUT 请求
     *
     * <p> module: 模块名称，如 user，必传。
     * <p> url: 请求地址，如 /selectById，必传。
     * <p> params: API请求函数参数，JSON格式，作为请求参数。
     */
    put: (module, url, params) => {
        return sendRequest({module, url, params, method: 'PUT'})
    },
    /**
     * 发送 DELETE 请求
     *
     * <p> module: 模块名称，如 user，必传。
     * <p> url: 请求地址，如 /selectById，必传。
     * <p> params: API请求函数参数，JSON格式，作为请求参数。
     */
    del: (module, url, params) => {
        return sendRequest({module, url, params, method: 'DELETE'})
    },
};